﻿using System;
using System.Collections.Generic;
using System.Text;

namespace MutiCodecO.codeclib
{
    class Url2Asii : ICodec
    {
        private int HexToInt(char c)
        {
            if (c <= '9' && c >= '0')
            {
                return (int)c - (int)'0';
            }
            else if (c >= 'A' && c <= 'F')
            {
                return (int)c - (int)'A' + 10;
            }
            else if (c >= 'a' && c <= 'f')
            {
                return (int)c - (int)'a' + 10;
            }
            else
            {
                return -1;
            }
        }

        public String parse(String strInput)
        {
            byte[] bytesInput = Encoding.Default.GetBytes(strInput);
            List<byte> bytesOutput = new List<byte>();
            for (int i = 0; i < bytesInput.Length; i++)
            {
                if (bytesInput[i] == '%')
                {
                    int c = HexToInt(Convert.ToChar(bytesInput[++i]));
                    if (c == -1)
                    {
                        bytesOutput.Add(bytesInput[i - 1]);
                        bytesOutput.Add(bytesInput[i]);
                        continue;
                    }
                    c *= 16;
                    int t = HexToInt(Convert.ToChar(bytesInput[++i]));
                    if (t == -1)
                    {
                        bytesOutput.Add(bytesInput[i - 2]);
                        bytesOutput.Add(bytesInput[i - 1]);
                        bytesOutput.Add(bytesInput[i]);
                        continue;
                    }
                    c += t;
                    bytesOutput.Add((byte)c);
                    continue;
                }
                bytesOutput.Add(bytesInput[i]);
            }
            return Encoding.Default.GetString(bytesOutput.ToArray());
        }

        public String parse(String strInput, String prefix, String partion)
        {
            String s = parse(strInput);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.Length; i++)
            {
                sb.Append(prefix);
                sb.Append(s[i]);
                if (i != s.Length - 1)
                    sb.Append(partion);
            }
            return sb.ToString();
        }
    }
}
